# 相关模块和扩展
from flask import Blueprint, request, render_template, jsonify, redirect, url_for, session
from exts import mail, db  # 导入邮件和数据库扩展
from flask_mail import Message  # 发送邮件的消息类
import string  # 生成随机字符串
import random  # 生成随机数
from models import EmailCaptchaModel, UserModel  # 数据库模型：验证码和用户表
from .forms import RegisterForm, LoginForm  # 表单验证类
from werkzeug.security import generate_password_hash, check_password_hash  # 密码加密和验证

# 创建蓝图（模块化路由），所有路由前加/auth（/login实际是/auth/login）
bp = Blueprint("auth", __name__, url_prefix='/auth')


@bp.route('/login', methods=['GET', 'POST'])
def login():  # 登录功能
    if request.method == 'GET':
        return render_template("login.html")  # 如果是访问页面，返回登录页面
    else:  # 如果是提交表单
        form = LoginForm(request.form)  # 用表单类验证数据
        # 如果通过验证，获取邮箱，密码
        if form.validate():
            email = form.email.data
            password = form.password.data
            user = UserModel.query.filter_by(email=email).first()  # 数据库查找用户
            if not user:
                print("邮箱在数据库中不存在！")
                return redirect(url_for("auth.login"))  # 用户不存在，重定向返回登录页
            # 验证密码
            if check_password_hash(user.password, password):
                # flask中的session，是经过加密存储在cookie中的
                session['user_id'] = user.id  # 将用户ID存到加密cookie
                return redirect("/")  # 重定向回到首页
            else:
                print("密码错误！")
                return redirect(url_for("auth.login"))
        else:  # 表单验证失败
            print(form.errors)  # 打印错误信息
            return redirect(url_for("auth.login"))


@bp.route('/register', methods=['GET', 'POST'])
def register():  # 注册功能
    if request.method == 'GET':  # 访问注册页
        return render_template("register.html")
    else:  # 提交注册信息
        form = RegisterForm(request.form)  # 表单验证
        if form.validate():  # 验证通过
            email = form.email.data
            username = form.username.data
            password = form.password.data
            # 获取邮箱、用户名、密码(进行加密)
            user = UserModel(email=email, username=username, password=generate_password_hash(password))
            db.session.add(user)  # 数据库添加用户
            db.session.commit()  # 提交保存
            return redirect(url_for("auth.login"))  # 跳转登录页
        else:  # 验证失败，打印错误
            print(form.errors)
            return redirect(url_for("auth.register"))


@bp.route("/logout")
def logout():
    session.clear()  # 清除所有session数据
    return redirect("/")


@bp.route('/captcha/email')
def get_email_captcha():  # 发送邮箱验证码
    email = request.args.get('email')  # 从URL参数获取邮箱
    source = string.digits * 6  # 生成0-9重复6次的字符串（60个字符）
    captcha = "".join(random.sample(source, 6))  # 随机选6个字符组合成验证码，并转化为字符串

    # 创建邮件内容：主题、收件人、验证码
    message = Message(subject="知了传课注册验证码", recipients=[email], body=f"您的验证码是：{captcha}")
    mail.send(message)  # 发送邮件

    # 检查是否已有该邮箱的验证码记录
    email_captcha = EmailCaptchaModel(email=email, captcha=captcha, used=False)
    existing_email_captcha = EmailCaptchaModel.query.filter_by(email=email).first()
    if existing_email_captcha:  # 存在则更新验证码
        existing_email_captcha.captcha = captcha
        db.session.commit()
    else:  # 不存在则新建记录
        db.session.add(email_captcha)
        db.session.commit()
    return jsonify({"code": 200, "message": "", "data": None})
